package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.MedidaVariableEstandarDTO;
import edu.shared.DTO.ProductoDTO;
import edu.shared.DTO.ProveedorDTO;

public class P_VerProducto extends Composite{
	
	private FlexTable ftMedidas;
		
	//columnas para la tabla dimensiones
	private static final int COL_MEDIDA_1 = 0;
	private static final int COL_MEDIDA_2 = 1;
	
	private FlexTable ftProveedores;
	
	//columnas para la tabla proveedores
	private static final int COL_NOMBRE = 0;
	private static final int COL_RUBRO = 1;
	private static final int COL_TELEFONO = 2;
	private static final int COL_MAIL = 3;
	private static final int COL_MAS_INFO = 4;
	
	private TabPanel tbPadre;
	private IngenieriaServiceAsync ingenieriaService;
	private List<MedidaVariableEstandarDTO> medidas;
	private List<ProveedorDTO> proveedores;
	private ProductoDTO producto;
	
	public P_VerProducto(TabPanel padre, ProductoDTO p) {
		
		this.producto = p;
		tbPadre = padre;
		ingenieriaService = GWT.create(IngenieriaService.class);
		proveedores = new LinkedList<ProveedorDTO>();
		medidas = producto.getMedidasEstandar();
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "993px");
		
		Label lblDetalleProducto = new Label("DETALLE DEL PRODUCTO");
		lblDetalleProducto.setStyleName("labelTitulo");
		layoutPanel.add(lblDetalleProducto);
		layoutPanel.setWidgetLeftWidth(lblDetalleProducto, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblDetalleProducto, 15.0, Unit.PX, 50.0, Unit.PX);
		
		//generamos el código del producto
		String codigoProducto = completarCeros(producto.getElemento().getClase().getCodigo()) + "-" + 
								completarCeros(producto.getElemento().getCodigo()) + "-" + 
								completarCeros(producto.getMaterial().getCodigo()) + "-" +
								completarCeros(producto.getMedidaFija().getCodigo());
		
		Label codigoLabel = new Label("CÓDIGO:");
		codigoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		codigoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(codigoLabel);
		layoutPanel.setWidgetLeftWidth(codigoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoLabel, 80.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox codigoTB = new TextBox();
		layoutPanel.add(codigoTB);
		layoutPanel.setWidgetLeftWidth(codigoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoTB, 75.0, Unit.PX, 32.0, Unit.PX);
		codigoTB.setText(codigoProducto);
		codigoTB.setEnabled(false);
		
		Label claseLabel = new Label("CLASE:");
		claseLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseLabel);
		layoutPanel.setWidgetLeftWidth(claseLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseLabel, 130.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox claseTB = new TextBox();
		layoutPanel.add(claseTB);
		layoutPanel.setWidgetLeftWidth(claseTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseTB, 125.0, Unit.PX, 32.0, Unit.PX);
		claseTB.setText(producto.getElemento().getClase().getNombre());
		claseTB.setEnabled(false);
		
		Label elementoLabel = new Label("ELEMENTO:");
		elementoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		elementoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(elementoLabel);
		layoutPanel.setWidgetLeftWidth(elementoLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoLabel, 130.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox elementoTB = new TextBox();
		layoutPanel.add(elementoTB);
		layoutPanel.setWidgetLeftWidth(elementoTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoTB, 125.0, Unit.PX, 32.0, Unit.PX);
		elementoTB.setText(producto.getElemento().getNombre());
		elementoTB.setEnabled(false);
		
		Label materialLabel = new Label("MATERIAL:");
		materialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		materialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(materialLabel);
		layoutPanel.setWidgetLeftWidth(materialLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialLabel, 180.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox materialTB = new TextBox();
		layoutPanel.add(materialTB);
		layoutPanel.setWidgetLeftWidth(materialTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialTB, 175.0, Unit.PX, 32.0, Unit.PX);
		materialTB.setText(producto.getMaterial().getNombre());
		materialTB.setEnabled(false);
		
		Label medidaFijaLabel = new Label("MEDIDA FIJA:");
		medidaFijaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		medidaFijaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(medidaFijaLabel);
		layoutPanel.setWidgetLeftWidth(medidaFijaLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaLabel, 180.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox medidaFijaTB = new TextBox();
		layoutPanel.add(medidaFijaTB);
		layoutPanel.setWidgetLeftWidth(medidaFijaTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaTB, 175.0, Unit.PX, 32.0, Unit.PX);
		medidaFijaTB.setText(producto.getMedidaFija().getMedida());
		medidaFijaTB.setEnabled(false);
		
		Label lblMedidaProducto = new Label("MEDIDAS DEL PRODUCTO");
		lblMedidaProducto.setStyleName("labelTitulo");
		layoutPanel.add(lblMedidaProducto);
		layoutPanel.setWidgetLeftWidth(lblMedidaProducto, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblMedidaProducto, 205.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spMedidas = new ScrollPanel();
		spMedidas.setStyleName("tabla");
		layoutPanel.add(spMedidas);
		layoutPanel.setWidgetLeftWidth(spMedidas, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spMedidas, 275.0, Unit.PX, 250.0, Unit.PX);
		
		ftMedidas = new FlexTable();
		spMedidas.setWidget(ftMedidas);
		ftMedidas.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna medida variable 1
		ftMedidas.setText(0, COL_MEDIDA_1, "MEDIDA VARIABLE 1");
		ftMedidas.getCellFormatter().setWidth(0, COL_MEDIDA_1, "50%");
		
		// columna medida variable 2
		ftMedidas.setText(0, COL_MEDIDA_2, "MEDIDA VARIABLE 2");
		ftMedidas.getCellFormatter().setWidth(0, COL_MEDIDA_2, "50%");
		
		// seteamos el estilo a los encabezados
		ftMedidas.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		
		Label lblProveedores = new Label("PROVEEDORES");
		lblProveedores.setStyleName("labelTitulo");
		layoutPanel.add(lblProveedores);
		layoutPanel.setWidgetLeftWidth(lblProveedores, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedores, 540.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spProveedores = new ScrollPanel();
		spProveedores.setStyleName("tabla");
		layoutPanel.add(spProveedores);
		layoutPanel.setWidgetLeftWidth(spProveedores, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spProveedores, 610.0, Unit.PX, 250.0, Unit.PX);
		
		ftProveedores = new FlexTable();
		spProveedores.setWidget(ftProveedores);
		ftProveedores.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna de nombre
		ftProveedores.setText(0, COL_NOMBRE, "NOMBRE");
		ftProveedores.getCellFormatter().setWidth(0, COL_NOMBRE, "30%");
		
		// columna rubro
		ftProveedores.setText(0, COL_RUBRO, "RUBRO");
		ftProveedores.getCellFormatter().setWidth(0, COL_RUBRO, "20%");
				
		// columna teléfono
		ftProveedores.setText(0, COL_TELEFONO, "TELÉFONO");
		ftProveedores.getCellFormatter().setWidth(0, COL_TELEFONO, "20%");
				
		// columna mail
		ftProveedores.setText(0, COL_MAIL, "E-MAIL");
		ftProveedores.getCellFormatter().setWidth(0, COL_MAIL, "20%");
		
		// columna más información
		ftProveedores.setText(0, COL_MAS_INFO, "+ INFO");
		ftProveedores.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		
		
		// seteamos el estilo a los encabezados
		ftProveedores.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label pie = new Label("");
		pie.setStyleName("labelTitulo");
		layoutPanel.add(pie);
		layoutPanel.setWidgetLeftWidth(pie, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pie, 860.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnAtras = new Button();
		
		//al presionar el botón cancelar
		btnAtras.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				atras();
			}
		});
		
		btnAtras.setText("SALIR");
		layoutPanel.add(btnAtras);
		layoutPanel.setWidgetRightWidth(btnAtras, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnAtras, 15.0, Unit.PX, 28.0, Unit.PX);
		
		cargarTablaMedidasVariables();
		cargarTablaProveedores();	
	}	
	
	/**
	 * Método que carga todas las medidas variables estándar del producto en la tabla de medidas variables.
	 */
	private void cargarTablaMedidasVariables()
	{
		// contador de filas. Empezamos de 1 porque la fila 0 es el encabezado
		int numeroFila = 1;
					
		//por cada medida variable estándar del producto 		
		for(MedidaVariableEstandarDTO medida :  medidas)
		{
			// columna medida 1
			ftMedidas.setWidget(numeroFila, COL_MEDIDA_1, new Label(String.valueOf(medida.getMedidaVariable1())));
			ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_1, true);
	
			// columna medida 2
			ftMedidas.setWidget(numeroFila, COL_MEDIDA_2, new Label(String.valueOf(medida.getMedidaVariable2())));
			ftMedidas.getCellFormatter().setWordWrap(numeroFila, COL_MEDIDA_2, true);
			
			//seteamos el estilo de renglón de tabla
			ftMedidas.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
			
			numeroFila++;
		}
	}
	
	/**
	 * Méotodo que carga la tabla de provedores con los proveedores que proveen el producto.
	 */
	private void cargarTablaProveedores()
	{
		int idProducto = producto.getIdProducto();
		ingenieriaService.buscarProveedores(idProducto, new AsyncCallback<List<ProveedorDTO>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
				
			}

			@Override
			public void onSuccess(List<ProveedorDTO> result) {
				proveedores = result;
				
				// contador de filas. Empezamos de 1 porque la fila 0 es el encabezado.
				int numeroFila = 1;
				
				for(ProveedorDTO proveedor : proveedores)
				{
					//columna nombre
					ftProveedores.setWidget(numeroFila, COL_NOMBRE, new Label(proveedor.getNombre()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_NOMBRE, true);
					
					// columna rubro
					ftProveedores.setWidget(numeroFila, COL_RUBRO, new Label(proveedor.getRubro()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_RUBRO, true);
	
					// columna teléfono
					ftProveedores.setWidget(numeroFila, COL_TELEFONO, new Label(proveedor.getTelefono()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_TELEFONO, true);
	
					// columna mail
					ftProveedores.setWidget(numeroFila, COL_MAIL, new Label(proveedor.getMail()));
					ftProveedores.getCellFormatter().setWordWrap(numeroFila, COL_MAIL, true);
	
					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");	
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftProveedores.getCellForEvent(event);
							
							//obtenemos el nombre del proveedor. Restamos 1 al row index porque la fila 1 es el encabezado
							String nombreProveedor = proveedores.get(celda.getRowIndex() - 1).getNombre();
							
							cargarMasInformacionProveedor(nombreProveedor);
						}
					});
					
					// columna más información
					ftProveedores.setWidget(numeroFila, COL_MAS_INFO, info);
					ftProveedores.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftProveedores.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
			}	
		});
	}
	
	/**
	 * Método que busca toda la información de un proveedor y lo muesta en un popup
	 * @param nombreProveedor. Nombre del proveedor a buscar.
	 */
	private void cargarMasInformacionProveedor(String nombreProveedor)
	{
		ingenieriaService.buscarProveedorCompleto(nombreProveedor, new AsyncCallback<ProveedorDTO>(){
			
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}

			@Override
			public void onSuccess(ProveedorDTO result) {

				ProveedorDTO proveedor = result;
				
				//creamos el popup "más información" de proveedor
				final P_DetalleProveedor popUpMasInfo = new P_DetalleProveedor(proveedor);
				
				//seteamos sus propiedades y la mostramos en pantalla
				popUpMasInfo.setGlassEnabled(true);
				popUpMasInfo.center();
				popUpMasInfo.show();							
			}
		});
		
	}
	
	/**
	 * Método que agrega un cero a los códigos de un dígito.
	 * @param codigo. Código original.
	 * @return String. Retorna el código rellenado con el creo, si es necesario.
	 */
	private String completarCeros(int codigo)
	{
		if(codigo < 10)
			return "0"+codigo;
		
		else
			return codigo+"";
	}
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 */
	 private void atras() {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_BuscarProductoSeleccion p_buscarProductoSeleccion = new P_BuscarProductoSeleccion(tbPadre);
		
		tbPadre.clear();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle("BUSCAR PRODUCTO");
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(p_buscarProductoSeleccion);
		tbPadre.add(formulario, "BUSCAR PRODUCTO", false);
		tbPadre.selectTab(Validaciones.numeroElemento(tbPadre, "BUSCAR PRODUCTO"));
		
		tbPadre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < tbPadre.getWidgetCount(); i++) {
			tbPadre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	 }
}